<html>
 <head>
  <meta charset="UTF-8">
 </head>
 <body>
  <h1 data-lake-id="RRfrY" id="RRfrY"><span data-lake-id="u585debda" id="u585debda">典型回答</span></h1>
  <p data-lake-id="ub6538e09" id="ub6538e09"><br></p>
  <p data-lake-id="ub36d3c70" id="ub36d3c70"><span data-lake-id="ubf63b827" id="ubf63b827">所谓大事务，一般是指事务中要执行的SQL很多，事务的时间比较长。</span></p>
  <p data-lake-id="u7c90a4f7" id="u7c90a4f7"><span data-lake-id="uaa435edf" id="uaa435edf">​</span><br></p>
  <p data-lake-id="u05126f16" id="u05126f16"><span data-lake-id="ub961f447" id="ub961f447">这样的事务，会带来很多问题。</span></p>
  <p data-lake-id="u50199153" id="u50199153"><span data-lake-id="ud9c66c86" id="ud9c66c86">​</span><br></p>
  <p data-lake-id="uf4e53db7" id="uf4e53db7"><span data-lake-id="u555d856e" id="u555d856e">1、占用数据库连接：这个很容易理解，SQL多了，执行的就会很慢，那么大的事务就会很长时间占用数据库链接，但是因为数据库连接是有限的，被长事务占用后，就会导致其他事务可能无法获取连接，导致应用的吞吐量下降， 影响系统可用性。</span></p>
  <p data-lake-id="u0af67c76" id="u0af67c76"><span data-lake-id="u2a3f43f4" id="u2a3f43f4">​</span><br></p>
  <p data-lake-id="uc161097a" id="uc161097a"><span data-lake-id="u3adc47c8" id="u3adc47c8">2、难以回滚：由于大事务涉及的数据量较大，执行回滚操作可能会变得非常耗时。如果事务需要回滚或失败，可能需要花费很长时间才能完全回滚所有修改，这会对数据库的可用性和性能造成负面影响。</span></p>
  <p data-lake-id="u63e001ab" id="u63e001ab"><span data-lake-id="u60067ed5" id="u60067ed5">​</span><br></p>
  <p data-lake-id="u2bee951b" id="u2bee951b"><span data-lake-id="ud90ea816" id="ud90ea816">3、锁竞争：大事务的话，写操作多了就可能要锁定许多数据。这可能导致其他并发事务在访问相同资源时遇到锁竞争，从而导致性能下降和延迟增加。长时间的锁定还可能导致其他事务的等待和阻塞。</span></p>
  <p data-lake-id="ucb2d1d8f" id="ucb2d1d8f"><br></p>
  <p data-lake-id="u068fac43" id="u068fac43"><span data-lake-id="u7a98a616" id="u7a98a616">4、日志空间占用：大事务会生成大量的日志，尤其是binlog，当单个事务最大允许使用的Binlog文件的大小超过了max_binlog_cache_size时，会导致报错：Multi-statement transaction required more than 'max_binlog_cache_size' bytes of storage; increase this mysqld variable and try again</span></p>
  <p data-lake-id="u196513ee" id="u196513ee"><span data-lake-id="u6cfe585c" id="u6cfe585c">​</span><br></p>
  <p data-lake-id="u7c485c91" id="u7c485c91"><span data-lake-id="ufd7b1457" id="ufd7b1457">​</span><br></p>
  <p data-lake-id="uc139a7fc" id="uc139a7fc"><span data-lake-id="ud218d03d" id="ud218d03d">解决方案：</span></p>
  <p data-lake-id="u5a024f60" id="u5a024f60"><span data-lake-id="ubc515748" id="ubc515748">​</span><br></p>
  <p data-lake-id="u2a4e79e1" id="u2a4e79e1"><span data-lake-id="u7c59e72d" id="u7c59e72d">拆分，把一个大事务，拆成多个事务。把不需要在事务中的操作，如读操作，内存计算操作、IO操作，远程调用等，放到事务外处理。</span></p>
 </body>
</html>